/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package tablasSql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import otros.MiTableModel;

/**
 *
 * @author FERRETERIA funciona esto?
 */
public class FacturasAlbaranes {
    
    public final static String TFACTURA = "facturas"; 
    public final static String TALBARANES = "albaranes";
    public final static String TPRESUPUESTO = "presupuestos";
    public final static String TFIADO = "fiados";
    public final static int NUMTABLAS = 4;
    public final static float PRECIOCERO = -999999; 
    
    public static int guardar (String [] datos, boolean guardar, int tipo) {
        int numString = 3;
        int numFloat = 6;
        String sql = "";
        String tabla = getTablaSql(tipo);
        
        switch (tipo) {
            case 0:     // facturas
            case 1:     // albaranes
                    if (!guardar) {
                       numString = 2;
                       numFloat = 7;
                       sql = "update " + tabla + " set fecha = ?, observacion = ?, total = ?, descuento = ?, totalmano = ?, negro=?, ";
                       sql += "entrego=?, pagoEn=?, idcliente = ?, tipopago = ?, vendedor = ? where id = ?";
                    }
                    else {
                        numString = 3;
                        numFloat = 8;
                        sql = "insert into " + tabla + " (fecha, fechaCrea, observacion, total, descuento, totalmano, negro, entrego, pagoEn,";
                        sql += "idcliente,tipopago, vendedor, idImp, idAno) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                    }
                break;
            case 3:             //fiado
                if (!guardar) {
                    numString = 3;
                    numFloat = 6;
                    sql = "update " + tabla + " set fecha = ?, fechaMod = ?,observacion = ?, total = ?, descuento = ?, totalmano = ?, ";
                    sql += "idcliente = ?, tipopago = ?, vendedor = ?  where id = ?";
                }
                else {
                    numString = 4;
                    numFloat = 7;
                    sql = "insert into " + tabla + " (fecha, fechacrea, fechaMod,observacion, total, descuento, totalmano, idcliente,";
                    sql += "tipopago,vendedor, idImp, idAno) values (?,?,?,?,?,?,?,?,?,?,?,?)";
                }
                break;
            default:    // los demas    
                if (!guardar) {
                    numString = 2;
                    numFloat = 5;
                    sql = "update " + tabla + " set fecha = ?, observacion = ?, total = ?, descuento = ?, totalmano = ?, ";
                    sql += "idcliente = ?, tipopago = ?,vendedor = ? where id = ?";
                }
                else {
                    numString = 3;
                    numFloat = 6;
                    sql = "insert into " + tabla + " (fecha, fechaCrea,observacion, total, descuento, totalmano, idcliente,";
                    sql += "tipopago, vendedor, idImp, idAno) values (?,?,?,?,?,?,?,?,?,?,?)";
                }
                break;
        
        }            
        return new Sql().actualizarDatos(sql, datos, numString, numFloat);        
    }
    
    public static void cambiarFechaCrea(int tipo, String nfecha, int id){
        String tabla = getTablaSql(tipo);
        String sql = "update " + tabla + " set fechacrea = '" + nfecha + "' where id = " + id;
        new Sql().hacerConsulta(sql);
    }
    
    public static void guardarLista (String [] datos) {
        int numString = 1;
        int numFloat = 6;
        String sql = "";
                
        sql = "insert into listaarticulos (detalle, margen,descuento,precio, total, cantidad, idarticulo, albaranes, ";
        sql += "pos, id) values (?,?,?,?,?,?,?,?,?,?)";

        new Sql().actualizarDatos(sql, datos, numString, numFloat);
    }
    
    public static int convertir (String [] datos) {
       String sql = "update listaarticulos set id = ?, albaranes = ?, pos = pos + ? where id = ? and albaranes = ?";
       new Sql().actualizarDatos(sql, datos, 0, 0);
       return Sql.getCount("id",datos[0], "listaarticulos");
    }
    
    public static ResultSet getListArticulos(int id, int tipo){
        String sql = "SELECT idarticulo, Detalle, cantidad, precio, margen, descuento, total from listaarticulos ";
        sql += " where id = " + id + " and albaranes = " + tipo + " order by pos asc";
        return new Sql().getDatos(sql);
    }
    
    public static ResultSet getFacturaAlbaran(int id, int tipo){
        String tabla = getTablaSql(tipo);
        String sql = "SELECT * from " + tabla;
        sql += " where id = " + id;
        return new Sql().getDatos(sql);
    }
    
    public static int getIdFacturaAlbaran(String id, String año, int tipo){
        int valor = -1;
        try {
            String tabla = getTablaSql(tipo);
            String sql = "SELECT id from " + tabla + " where idImp = " + id + " and idAno = " + año;
            ResultSet res = new Sql().getDatos(sql);
            if (res.next())
                valor = res.getInt("id");
            
        } catch (SQLException ex) {
            ;
        }
        return valor;
    }
    
    public static int getIdImpFacturaAlbaran(int id, int tipo){
        int valor = -1;
        try {
            String tabla = getTablaSql(tipo);
            String sql = "SELECT idImp from " + tabla + " where id = " + id;
            ResultSet res = new Sql().getDatos(sql);
            if (res.next())
                valor = res.getInt("idImp");
            
        } catch (SQLException ex) {
            ;
        }
        return valor;
    }
    
    public static ResultSet getDatos(String sql) {
        return new Sql().getDatos(sql);
    }
    
    
    public static void borrarListArticulos (int id, int tipo) {
       String sql = "delete from listaarticulos where id = " + id;
       sql += " and albaranes = " + tipo;
       new Sql().hacerConsulta(sql); 
    }
    
    public static void borrarFactAlbaran (int id, int tipo) {
       String tabla = getTablaSql(tipo);
       String sql = "delete from " + tabla + " where id = " + id;
       new Sql().hacerConsulta(sql); 
    }
    
     // funcion que se encarga de hacer un descuento en los articulos 
    public static void RealizarDescuentoDia(String id) {
        String [] datos = {id.substring(5), id.substring(0, 4)};
        String sql = "update facturas set idDinero = -1 where idImp = ? and idAno = ?";
        new Sql().actualizarDatos(sql, datos, 0, 1); 
    }
    
    public static void RealizarDescuentoDia(String fecha, int idDinero) {
        String [] datos = {""+idDinero};
        String sql = "update facturas set idDinero = ? where date(fecha) = '" + fecha + "' and idDinero is null";
        new Sql().actualizarDatos(sql, datos, 0, 0); 
    }
    
    public static String getTablaSql(int tipo){
        switch(tipo) {
            case 0:
                return TFACTURA;
            case 1:
                return TALBARANES;
            case 2:
                return TPRESUPUESTO;
            case 3:
                return TFIADO;
        }
        return null;
    }
    //-----------------------------------------------------------------------------------tabla
    public static MiTableModel getTabla(boolean negro, int vendedor, int tipoTicket, int idAno,
                                         int id, int tipo, int idCliente, int dia, int mes, int año) {
        String[] columNames = {"ID", "Cliente","Tipo", "Imp.Bruto", "Fecha"}; 
        String[] tableNames = {"campo", "Cliente","tipopago", "importe", "fecha"};
        Class [] tipos = {String.class, String.class, String.class, Float.class, String.class};
        
        String[] columNames3 = {"ID", "Cliente","Tipo", "Imp.Bruto", "Fecha", "F. Modificado"}; 
        String[] tableNames3 = {"campo", "Cliente","tipopago", "importe", "fecha", "fechaMod"};
        Class [] tipos3 = {String.class, String.class, String.class, Float.class, String.class, String.class};
        
        // campos q se utilizan para descuento
        String[] columNames2 = {"ID", "Cliente","Tipo", "Imp.Bruto", "Fecha", "Negro"}; 
        String[] tableNames2 = {"campo", "Cliente","tipopago", "importe", "fecha", "negro"};
        Class [] tipos2 = {String.class, String.class,String.class, Float.class, String.class, Float.class};
        
        String tabla = getTablaSql(tipoTicket);
        String campoExtra = negro ? ", negro" : "";
        
        String modFecha = (tipoTicket == 3)? "FechaMod," : "";
        
        String importe = "if(totalmano <> 0, if(totalmano="+PRECIOCERO+",0,totalmano),(1-descuento/100)*total)"; 
        //if (!negro && (tipoTicket == 0) && (tipo == 1))
        //    importe = "if(negro > 0, "+ importe + " - negro,"+importe+ ")";
            
        String sql = "SELECT concat_ws('-', " +tabla + ".idAno,"+tabla+".idImp) as campo,"
                      + "concat_ws(' '," + tabla + ".observacion, nclientes.nombrecomercial) as Cliente, "
                      + tabla + ".tipopago, "
                      + importe + " as importe, fecha, " + modFecha
                      + "totalmano" + campoExtra + " from "+ tabla + ", nclientes " 
                      + "where " + tabla + ".idcliente = nclientes.codigo";

        String contar = tabla;
        
        Vector<String> ops = new Vector<String>();
        if (idAno != 0)
            ops.add(tabla + ".idAno = " + idAno);
        if (id != 0)
            ops.add(tabla + ".idImp = " + id);
        if (vendedor != 0)
            ops.add(tabla + ".vendedor = " + (vendedor-1));
        if (tipo != 0)
            ops.add(tabla + ".tipopago = " + (tipo-1));
        if (idCliente >= 0)
            ops.add(tabla + ".idcliente = " + idCliente);
        if (dia != 0)
            ops.add("DAY(" + tabla + ".fecha) = " + dia);
        if (mes != 0)
            ops.add("MONTH(" + tabla + ".fecha) = " + mes);
        if (año != 0)
            ops.add("YEAR(" + tabla + ".fecha) = " + año);
//        if (negro)
//            ops.add(tabla +".negro > 0");
            
        for(int i = 0; i < ops.size(); i++) {
            sql += " and " + ops.get(i);
            if (i > 0)
               contar += " and " + ops.get(i);
            else
                contar += " where " + ops.get(i);
        }
        sql += " order by " + tabla + ".id desc";
        
        MiTableModel dtable;
        if (negro) {
            Object[][] dtDatos = getTabla(tableNames2, contar, sql, tipos2);
            dtable = new MiTableModel(dtDatos,columNames2);
        }
        else {
            if (tipoTicket == 3) {      // fiados
                Object[][] dtDatos = getTabla(tableNames3, contar, sql, tipos3);
                dtable = new MiTableModel(dtDatos,columNames3);
            }
            else {
                Object[][] dtDatos = getTabla(tableNames, contar, sql, tipos);
                dtable = new MiTableModel(dtDatos,columNames);
            }
        }
        
        return dtable;    
    }    
    
    
    public static Object [][] getTabla(String colName[], String tabla, String sql, Class[] tipos) {
        Sql mySql = new Sql();
        Object[][] data = new Object[mySql.getSizeTable(tabla)][colName.length];  
        String col[] = new String[colName.length];
        //realizamos la consulta sql y llenamos los datos en "Object"
        try{
           ResultSet res = mySql.getDatos(sql);
           int i = 0;
           while(res.next()){            
              for(int j=0; j<=colName.length-1;j++){             
                 if ((tipos[j] == java.lang.Integer.class))
                     data[i][j] = new Integer (res.getInt(colName[j]));    
                 else if (tipos[j] == java.lang.Float.class) 
                     data[i][j] = new Float (res.getFloat(colName[j]));
                 else
                     data[i][j] = res.getString(colName[j]);
              }          
              i++;
           }
           res.close();
         }catch(SQLException e){
            //log.error(sql + "\n" + e);
         } 
       return data;
    }
    
    public static MiTableModel getTabla347(int tipoTicket, int idCliente, 
                                            String año) {
        String[] columNames = {"Id","Cliente", "Total Pagado"}; 
        String[] tableNames = {"id", "Cliente", "importe"};
        Class [] tipos = {Integer.class, String.class, Float.class};
        
        String tabla = getTablaSql(tipoTicket);
        
        String sql = "SELECT " + tabla + ".idcliente as id, nclientes.nombrecomercial as Cliente, "
                      + "sum(if(totalmano <> 0, if(totalmano="+PRECIOCERO+",0,totalmano),(1-descuento/100)*total)) as importe "
                      + "from "+ tabla + ", nclientes " +
                     "where " + tabla + ".idcliente = nclientes.codigo";

        Vector<String> ops = new Vector<String>();
        
        if (idCliente >= 0)
            ops.add(tabla + ".idcliente = " + idCliente);
        
        if (año != null)
            ops.add("Year(" + tabla + ".fechacrea) = " + año );
                
            
        for(int i = 0; i < ops.size(); i++) {
            sql += " and " + ops.get(i);
        }
        sql += " group by " + tabla + ".idCliente desc";
        
        MiTableModel dtable = null;
        ResultSet res = new Sql().getDatos(sql);
        try {
            dtable = new MiTableModel(null,columNames);
            while (res.next()) {
               dtable.addRow(new Object[] { res.getInt(tableNames[0]), 
                                            res.getString(tableNames[1]), 
                                            new Float (res.getFloat(tableNames[2]))});
            }    
        } catch (SQLException ex) {
            dtable = null;
        }
        return dtable;    
    }    
        
    public static Float [] getTrimestres(int tipoTicket, String codCliente, String año) {
        String tabla = getTablaSql(tipoTicket);
        String sql = "SELECT sum(total) as suma, quarter(fechacrea) as trimestre" +
                     " From " + tabla +
                     " where " + tabla + ".idcliente = " + codCliente +
                     " and year(fechacrea) = " + año +
                     " group by trimestre";
        Float trim [] = new Float[4];
        ResultSet rs =  new Sql().getDatos(sql);
        try {
            while (rs.next()) {
                trim [rs.getInt("trimestre")-1] = rs.getFloat("suma");
            }
        } catch (Exception e) {
            trim = null;
        }
        return trim;
    }    
    
    public static MiTableModel getTablaCaja(boolean negro, int dia, int mes, int año) {
        String[] columNames = {"ID", "Cliente", "Imp.Bruto", "Forma Pago", "Turno", "Vendedor"}; 
        String[] tableNames = {"campo", "Cliente", "importe", "pagoEn", "hora", "vendedor"};
        Class [] tipos = {String.class, String.class, Float.class, String.class, String.class, String.class};
  
        // campos q se utilizan para Negro
        String[] columNames2 = {"ID", "Cliente", "Imp.Bruto", "Forma Pago", "Turno", "Vendedor","Negro"}; 
        String[] tableNames2 = {"campo", "Cliente", "importe", "pagoEn","hora", "vendedor","negro"};
        Class [] tipos2 = {String.class, String.class, Float.class, String.class,String.class,String.class,Float.class};
        
        String tabla = getTablaSql(0);
        String campoExtra = negro ? ", negro, false" : "";
        
        String importe = "";
        if (negro) 
            importe = "if(totalmano <> 0, if(totalmano="+PRECIOCERO+",0,totalmano-negro),"
                + //"if(((1-descuento/100)*total - negro) < 0,0.0,(1-descuento/100)*total - negro))"; 
            "truncate( (1-descuento/100)*total - negro, 4))"; 
        else
            importe = "if(totalmano <> 0, if(totalmano="+PRECIOCERO+",0,totalmano)," +
                      " (1-descuento/100)*total)"; 
        
        String sql = "SELECT concat_ws('-'," + tabla + ".idAno,"+tabla+".idImp) as campo,"
                      + "nclientes.nombrecomercial as Cliente, "
                      + importe + " as importe, pagoEn, "
                      + "hour(" + tabla + ".fecha) as hora , vendedor "
                      + campoExtra + " from "+ tabla + ", nclientes " +
                     "where " + tabla + ".idcliente = nclientes.codigo and " +tabla+".tipopago=0";

        String contar = tabla + " where tipopago=0 ";
        
        Vector<String> ops = new Vector<String>();
        if (dia != 0)
            ops.add("DAY(" + tabla + ".fecha) = " + dia);
        if (mes != 0)
            ops.add("MONTH(" + tabla + ".fecha) = " + mes);
        if (año != 0)
            ops.add("YEAR(" + tabla + ".fecha) = " + año);
        if (!negro)
            ops.add(tabla +".negro <= 0");
            
        for(int i = 0; i < ops.size(); i++) {
            sql += " and " + ops.get(i);
            contar += " and " + ops.get(i);
        }
        sql += " order by " + tabla + ".id desc";
        
        MiTableModel dtable;
        if (negro) {
            Object[][] dtDatos = getTabla(tableNames2, contar, sql, tipos2);
            dtable = new MiTableModel(dtDatos,columNames2);
            dtable.addColumn("", new Vector<Boolean>());
            dtable.setType(new Class[] {String.class, String.class, Float.class, 
                                String.class, String.class,String.class,Float.class, Boolean.class});
            dtable.setEditable(new Boolean[] {false,false,false,false,false,false,false,true});
        }
        else {
            Object[][] dtDatos = getTabla(tableNames, contar, sql, tipos);
            dtable = new MiTableModel(dtDatos,columNames);
        }
        //Albaranes en contado
        sql = sql.replaceAll(tabla, getTablaSql(1));
        ResultSet res = new Sql().getDatos(sql);
        try {
            while (res.next()) { 
                if (negro)
                    dtable.addRow(new Object [] {res.getString("campo"), res.getString("Cliente"), 
                        res.getFloat("importe"),""+(res.getInt("pagoEn")+10) , res.getString("hora"), 
                        ""+res.getInt("vendedor"),res.getFloat("negro"), Boolean.FALSE});
                else
                   dtable.addRow(new Object [] {res.getString("campo"), res.getString("Cliente"), 
                        res.getFloat("importe"),""+(res.getInt("pagoEn")+10), 
                        res.getString("hora"),""+res.getInt("vendedor")});
            }
        } catch (SQLException ex) {
            System.out.println("getTablaCaja:" + ex);
        }
        return dtable;    
    }    
        
    public static void ConvertirNegro(String tabla, String anio, String idImp, float negro) {
        String sql = "update " + tabla + " set negro = " + negro + 
                " where idImp = " + idImp + " and idAno = " + anio;
        new Sql().hacerConsulta(sql);
    }
    
    public static MiTableModel getTablaArtXCliente(String idCliente, int dia, int mes, int año) { 
                                          
        String[] columNames = {"Id Articulo", "Detalle", "Cantidad", "Factura", "Fecha"}; 
        String[] tableNames = {"idarticulo", "detalle", "cantidad", "idFact", "fecha"};
        Class [] tipos = {Integer.class, String.class, Float.class, String.class, String.class};
        
        String sql = "select idarticulo, detalle, cantidad, "
                            + "concat_ws('-',facturas.idAno,facturas.idImp) as idFact,"
                            + "fecha from facturas, listaarticulos "
                            + "where facturas.id=listaarticulos.id and idcliente=" + idCliente;
        
        Vector<String> ops = new Vector<String>();
        String tabla = "facturas";
        String contar = "facturas, listaarticulos "
                        + "where facturas.id=listaarticulos.id and idcliente=" + idCliente;
        if (dia != 0)
            ops.add("DAY(" + tabla + ".fecha) = " + dia);
        if (mes != 0)
            ops.add("MONTH(" + tabla + ".fecha) = " + mes);
        if (año != 0)
            ops.add("YEAR(" + tabla + ".fecha) = " + año);
            
        for(int i = 0; i < ops.size(); i++) {
            sql += " and " + ops.get(i);
            contar += " and " + ops.get(i);
        }
        sql += " order by fecha desc";
        
        MiTableModel dtable = null;
      //  ResultSet res = new Sql().getDatos(sql);
        Object[][] dtDatos = getTabla(tableNames, contar, sql, tipos);
        dtable = new MiTableModel(dtDatos,columNames);
   
        return dtable;    
    }    
    
}
